@256
D=A
@SP
M=D
@1
D=A
@LCL
M=D
@2
D=A
@ARG
M=D
@3
D=A
@THIS
M=D
@4
D=A
@THAT
M=D
@bootstrap
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@5
D=A
@SP
D=M-D
@ARG
M=D
@SP
D=M
@LCL
M=D
@Sys.init
0;JMP
(bootstrap)

//function Sys.init 0
(Sys.init)

//push constant 4
@4
D=A
@SP
A=M
M=D
@SP
M=M+1

//call Main.fibonacci 1   
@End$Main.fibonacci$0
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@6
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(End$Main.fibonacci$0)

//label WHILE
(Sys.init$WHILE)

//goto WHILE              
@Sys.init$WHILE
0;JMP

//function Main.fibonacci 0
(Main.fibonacci)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 2
@2
D=A
@SP
A=M
M=D
@SP
M=M+1

//lt                     
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
M=-1
@Main_JMP_1
D;JLT
@SP
A=M
M=0
(Main_JMP_1)
@SP
M=M+1

//if-goto IF_TRUE
@SP
AM=M-1
D=M
@Main.fibonacci$IF_TRUE
D;JNE

//goto IF_FALSE
@Main.fibonacci$IF_FALSE
0;JMP

//label IF_TRUE          
(Main.fibonacci$IF_TRUE)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R15
D=M
@5
AD=D-A
A=M
0;JMP

//label IF_FALSE         
(Main.fibonacci$IF_FALSE)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 2
@2
D=A
@SP
A=M
M=D
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//call Main.fibonacci 1  
@End$Main.fibonacci$1
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@6
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(End$Main.fibonacci$1)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 1
@SP
A=M
M=1
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//call Main.fibonacci 1  
@End$Main.fibonacci$2
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@6
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(End$Main.fibonacci$2)

//add                    
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=D+M
@SP
A=M
M=D
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R15
D=M
@5
AD=D-A
A=M
0;JMP